package com.itheima.publisher.config;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @author ChenPi
 * @since 2025/03/06 13:48
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
public class MqConfig {

    private final RabbitTemplate rabbitTemplate;

    /**
     * 注意：
     * 开启生产者确认比较消耗MQ性能，一般不建议开启。而且大家思考一下触发确认的几种情况：
     * - 路由失败：一般是因为RoutingKey错误导致，往往是编程导致
     * - 交换机名称错误：同样是编程错误导致
     * - MQ内部故障：这种需要处理，但概率往往较低。因此只有对消息可靠性要求非常高的业务才需要开启，而且仅仅需要开启ConfirmCallback处理nack就可以了。
     */
    @PostConstruct
    public void init() {
        rabbitTemplate.setReturnsCallback(returned -> {
            log.error("监听到消息的return callback");
            log.debug("交换机：{}",returned.getExchange());
            log.debug("RoutingKey：{}",returned.getRoutingKey());
            log.debug("Message：{}",returned.getMessage());
            log.debug("ReplyCode：{}",returned.getReplyCode());
            log.debug("ReplayText：{}",returned.getReplyText());
        });
    }

}
